package main

import "fmt"

/* 关于继承与复写方法的调用 */

func main() {
	c := &Tc{
		name: "c",
		age:  1,
	}
	f := &Tf{}
	f.name = "fff"
	f.age = 22
	c.Name()
	c.Age()
	fmt.Println("f_val:")
	f.Name()
	fmt.Println("-----")
	f.Age() // Tf复写了Name方法后，在Age方法里又调用Name方法，这个时候会调用到 新的Name() 还是 旧的Name()?
}

type Tc struct {
	age  int
	name string
}

func (c *Tc) Name() string {
	fmt.Println("Name() in Tc ")
	fmt.Println(c.name)
	return c.name
}

func (c *Tc) Age() {
	fmt.Println(c.age)
	fmt.Println(c.Name()) // Age() will invoke the Name() which from Tc
	// 在Tf调用Age方法时候，这里还是用了Tc的Name，并没有调用新的Name()
	// 原因是golang调用方法时候，其实只是把receiver作为第一个参数传进去，调用的自然就是Tc的方法
}

type Tf struct {
	sss string
	Tc
}

// 复写了Name方法
func (f *Tf) Name() string {
	fmt.Println("Name() in Tf ")
	fmt.Println(f.sss)
	return f.sss
}
